Better Design

제공받은 인터페이스의 내부를 바꾸고 싶은 경우,
- 모든 포인터 사용처마다 포인터의 유효성 검사를 수행한다.
- 디폴트 인자를 사용(const shared_ptr<Logger>& logger=no_logging)
    포인터 유효성 검사를 필요로 함
- optional 타입을 이용(boost::optional 또는 C++17 optional)
    optional<shared_ptr<T>>을 전달해야 하며, optional 공백 여부를 검사하는 작업이 필요